package org.tnc.service;

import java.util.List;

import org.springframework.security.userdetails.UsernameNotFoundException;
import org.springframework.transaction.annotation.Transactional;
import org.tnc.dao.UserDao;
import org.tnc.model.User;


/**
 * Business Service Interface to handle communication between web and
 * persistence layer.
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 *  Modified by <a href="mailto:dan@getrolling.com">Dan Kibler </a> 
 */
@Transactional
public interface UserManager extends UniversalManager {

    /**
     * Convenience method for testing - allows you to mock the DAO and set it on an interface.
     * @param userDao the UserDao implementation to use
     */
    void setUserDao(UserDao userDao);

    /**
     * Retrieves a user by userId.  An exception is thrown if user not found
     *
     * @param userId the identifier for the user
     * @return User
     */
    User getUser(String userId);

    /**
     * Finds a user by their username.
     * @param username the user's username used to login
     * @return User a populated user object
     * @throws org.springframework.security.userdetails.UsernameNotFoundException
     *         exception thrown when user not found
     */
    User getUserByUsername(String username) throws UsernameNotFoundException;
    
    /**
     * 
     * @param supervisor
     * @return
     */
    List<User> getUsersBySupervisor(User supervisor);

    /**
     * Retrieves a list of users, filtering with parameters on a user object
     * @param user parameters to filter on
     * @return List
     */
    List<User> getUsers(User user);
    
    /**
     * Retrieves a list of users
     * @return
     */
    List<User> getUsers();
    
    /**
     * Saves a user's information.
     *
     * @param user the user's information
     * @throws UserExistsException thrown when user already exists
     * @return user the updated user object
     */
    User saveUser(User user) throws UserExistsException;

    /**
     * Removes a user from the database by their userId
     *
     * @param userId the user's id
     */
    void removeUser(String userId);
    /**
     * Find user by their email, this email shoud be only
     * @param email
     * @return
     * @throws UsernameNotFoundException
     */
    User getUserByUserEmail(String email) throws UsernameNotFoundException;
    
    /**
     * Find user by their project.
     * @param project
     * @return null if not found.
     */
    User getUserByProject(String project);
    
    /**
     * 
     * @param object
     */
    public void detach(Object object);
    
    
    public void sendEmailTo(String subject, String message, User userTo, User userCc);
}
